package com.czg.jsonschema2lombokpojo.rules;

import java.util.Iterator;

import com.czg.jsonschema2lombokpojo.Schema;

import com.fasterxml.jackson.databind.JsonNode;
import com.sun.codemodel.JDocCommentable;

/**
 * 应用“必需的”schema规则。
 *
 */
public class NotRequiredRule implements Rule<JDocCommentable, JDocCommentable> {

    private final RuleFactory ruleFactory;

    protected NotRequiredRule(RuleFactory ruleFactory) {
        this.ruleFactory = ruleFactory;
    }

    /**
     * 应用此schema规则来执行不需要的代码生成步骤。
     * <p>
     * 如果需要JSR-305注解，则非必需规则添加Nullable注解。
     *
     * @param nodeName
     *            添加了“required”规则的schema节点的名称
     * @param node
     *            “非必需”节点，值<code>false</code>或<code>no value</code>
     * @param parent
     *            父节点
     * @param generatableType
     *            可能被标记为“非必需”的类或方法
     * @return 附加到generatableType的JavaDoc注解，其中<em>可能</em>添加了not以将此构造标记为不需要。
     */
    @Override
    public JDocCommentable apply(String nodeName, JsonNode node, JsonNode parent, JDocCommentable generatableType, Schema schema) {

        // 因为notrequirerule是对所有没有“required”的字段执行的，所以我们需要识别字段是否是RequiredArrayRule的一部分。
        JsonNode requiredArray = schema.getContent().get("required");

        if (requiredArray != null) {
            for (Iterator<JsonNode> iterator = requiredArray.elements(); iterator.hasNext(); ) {
                String requiredArrayItem = iterator.next().asText();
                if (nodeName.equals(requiredArrayItem)) {
                    return generatableType;
                }
            }
        }
        return generatableType;
    }
}
